package com.shujia.scala

object Demo15Fun2 {
  def main(args: Array[String]): Unit = {

    /**
      * 函数的应用
      *
      * 高阶函数
      *
      * 1、以函数作为参数  重点
      * 2、以函数作为返回值
      *
      */

    /**
      * 1、以函数作为参数
      *
      *
      * f: 是一个参数为String 返回值为Int类型的函数
      *
      * fun1 是什么类型的函数？
      * fun1是一个参数为f 没有返回值的函数
      *
      */

    def fun1(f: String => Int): Unit = {

      //调用传进来的函数
      val i: Int = f("100")

      println(i)

    }

    def f1(str: String): Int = {
      str.toInt
    }

    //需要传入一个参数为String 返回值为Int类型的函数
    fun1(f1)


    def f2(str: String): Int = {
      (str + "1232123").toInt
    }

    fun1(f2)


    /**
      * 使用lambda 作为参数
      *
      */

    fun1((s: String) => {
      val i: Int = s.toInt
      //最后一行作为返回值
      i
    })

    /**
      * 简写
      *
      */
    //如果代码只有一行括号可以省略
    fun1((s: String) => s.toInt + 1)

    //1、lambda 的参数类型可以省略
    //lambda 表达式参数的类型会自动推断
    fun1(s => s.toInt)

    //如果lambda的参数只使用了一次可以使用下划线代替
    fun1(_.toInt)


    println("=" * 100)

    /**
      * 应用
      *
      */

    val arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)

    /**
      * foreach： 一行一行遍历数组中的元素, 将数组中的元素一个一个传递给后面的函数
      *
      * foreach 将循环之后需要做的处理交给调用者，调用者传一个函数进去
      */
    arr.foreach((i: Int) => {
      println(i + 1)
    })

    println("=" * 100)
    //简写
    arr.foreach(i => println(i + 1))

    arr.foreach(println(_))

    println("=" * 100)
    /**
      * println 是一个参数为Any 没有返回值的函数
      *
      * arr.foreach 需要的是参数为Int 没有返回值的函数
      *
      * scala函数的调用也符合多态的是想
      *
      */
    arr.foreach(println)



  }

}
